package com.example.work;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;

import android.widget.Button;



public class ProgressDialogTest extends Activity {
    // 该程序模拟填充长度为100的数组
    private int[] data = new int[100];
    int hasData = 0;
    // 定义进度对话框的标识
    final int PROGRESS_DIALOG = 0x112;
    // 记录进度对话框的完成百分比
    int progressStatus = 0;
    ProgressDialog pd;
    // 定义一个负责更新的进度的Handler
    @SuppressLint("HandlerLeak")
            Handler handler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == PROGRESS_DIALOG) {
                if (pd != null) {
                    pd.setProgress(progressStatus);
                }
            }
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_progress_dialog_test);
        Button execBn = (Button) findViewById(R.id.button10);
        execBn.setOnClickListener(v -> {
            progressStatus = 0;
            hasData = 0;
            showDialog(PROGRESS_DIALOG);
        });
    }

    @Override
    @Deprecated
    public Dialog onCreateDialog(int id, Bundle status) {
        System.out.println("------create------");
        if (id == PROGRESS_DIALOG) {
            // 创建进度对话框
            pd = new ProgressDialog(this);
            pd.setMax(100);
            // 设置对话框的标题
            pd.setTitle("任务完成百分比");
            // 设置对话框 显示的内容
            pd.setMessage("耗时任务的完成百分比");
            // 设置对话框不能用“取消”按钮关闭
            pd.setCancelable(false);
            // 设置对话框的进度条风格
            pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            // 设置对话框的进度条是否显示进度
            pd.setIndeterminate(false);
            return pd; // 返回创建的对话框
        }
        return null; // 如果 ID 不匹配，返回 null
    }

    // 该方法将在onCreateDialog方法调用之后被回调
    @Override
    @Deprecated
    public void onPrepareDialog(int id, Dialog dialog) {
        System.out.println("------prepare------");
        super.onPrepareDialog(id, dialog);
        if (id == PROGRESS_DIALOG) {
            // 确保 dialog 是 ProgressDialog 类型
            if (dialog instanceof ProgressDialog) {
                final ProgressDialog progressDialog = (ProgressDialog) dialog; // 使用传入的 dialog
                // 对话框进度清零
                progressDialog.setProgress(0); // 直接设置为0比incrementProgressBy(-getProgress())更清晰
                progressStatus = 0; // 重置内部状态变量
                hasData = 0;       // 重置数据计数

                new Thread() {
                    public void run() {
                        while (progressStatus < 100) {
                            // 获取耗时操作的完成百分比
                            progressStatus = doWork();

                            // 创建消息对象
                            Message msg = handler.obtainMessage(); // 从消息池获取，效率更高
                            msg.what = PROGRESS_DIALOG; // 设置消息标识符

                            // 发送消息
                            handler.sendMessage(msg);
                        }
                        // 如果任务已经完成
                        if (progressStatus >= 100) {
                            // 确保在 UI 线程关闭对话框
                            handler.post(() -> { // 使用 post 也可以切换到主线程
                                if (progressDialog.isShowing()) {
                                    progressDialog.dismiss();
                                }
                            });
                        }
                    }
                }.start();
            }
        }
    }

    // 模拟一个耗时的操作。
    public int doWork() {
        // 防止数组越界
        if(hasData >= data.length) {
            return 100;
        }
        // 为数组元素赋值
        data[hasData++] = (int) (Math.random() * 100);
        try {
            // 模拟耗时
            Thread.sleep(100); // 每次暂停 100毫秒
        } catch (InterruptedException e) {
            e.printStackTrace();
            Thread.currentThread().interrupt(); // 重新设置中断状态
        }
        // 返回当前的进度百分比
        return hasData;
    }

    // 当 Activity 销毁时，移除消息，防止内存泄漏
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 移除 Handler 中的所有消息和回调
        if (handler != null) {
            handler.removeCallbacksAndMessages(null);
        }
        // 如果对话框仍在显示，尝试关闭它
        if (pd != null && pd.isShowing()) {
            pd.dismiss();
        }
    }
}